package com.ethan.common.orm.service;

import java.io.Serializable;
import java.util.Map;

import com.ethan.common.exception.ServiceException;
import com.ethan.common.orm.Page;

public interface IBaseService<E,PK extends Serializable> {
	/**
	 * 根据id查找该对象
	 *@param id
	 *@return
	 */
	public E getById(PK id) throws ServiceException;
	
	 public E loadById(PK id) throws ServiceException;
	/**
	 * 删除指定的对象数据
	 *@param entity
	 */
	public void delete(E entity) throws ServiceException;
	
	/**
	 * 
	 *@param id
	 */
	public void deleteById(PK id) throws ServiceException;
	
	/**
	 *  删除多个对象的数据
	 *@param ids
	 */
	public void deleteAllByIds(PK[] ids) throws ServiceException;
	
	/**
	 * 保存
	 * @param entity
	 * @throws ServiceException
	 */
	public void save(E entity) throws ServiceException;
	
	/**
	 * 更新
	 * @param entity
	 * @throws ServiceException
	 */
	public void update(E entity) throws ServiceException;

	/**
	 * 更新或更新
	 * @param entity
	 * @throws ServiceException
	 */
	public void saveOrUpdate(E entity) throws ServiceException;
	
	/**
	 * 得到所有数据
	 * @return
	 */
	public Page<E> findAll(Page<E> page);
		
	/**
	 * 根据指定一组属性和值得到符合条件的结果
	 * @param names
	 * @param values
	 * @return
	 * @throws ServiceException 
	 */
	public Page<E>  findByProperty(String[] names,String[] values) throws ServiceException;
	
	/**
	 * 根据指定一组属性和值得到符合条件的结果
	 * @param names
	 * @param values
	 * @return
	 * @throws ServiceException 
	 */
	public Page<E>  findByProperty(String name,String value) throws ServiceException;
	
	/**
	 * 按HQL查询唯一对象.
	 * 
	 * @param values
	 *            命名参数,按顺序绑定.
	 *@return
	 *@throws ServiceException
	 */
	public E findUnique(String hql,Object... values)  throws ServiceException;
	
	/**
	/**
	 * 按HQL查询唯一对象.
	 * 
	 * @param values
	 *            命名参数,按名称绑定.
	 *@return
	 *@throws ServiceException
	 */
	public E findUnique(String hql, Map<String, ?> values)throws ServiceException;
	/**
	 * 判断一个对象属性值在数据库中是否是唯一的
	 *@param entity
	 *@param uniquePropertyNames
	 *@return
	 *@throws ServiceException
	 */
	public boolean isUnique(String propertyName,
			Object newValue, Object oldValue) throws ServiceException;
}
